package com.diy.sigmund.diycommon.util.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author ylm-sigmund
 * @since 2023/1/29 11:04
 */
public class SimplePriorities implements Runnable{

    private int priority;

    public SimplePriorities(int priority) {
        this.priority = priority;
    }

    @Override
    public void run() {
        // 设置优先级,优先级越高在概率上越优先运行,并不是说与低优先级相比一定会先运行
        // 尽管 JDK 有 10 个优先级，但是一般只有MAX_PRIORITY，NORM_PRIORITY，MIN_PRIORITY 三种级别。
        Thread.currentThread().setPriority(priority);
        for(int i = 0;i < 100;i++){
            System.out.println(this);
            if(i % 10 == 0){
                // 线程让步,并不准确,Thread.yield() 是建议执行切换CPU，而不是强制执行CPU切换。
                // 对于任何重要的控制或者在调用应用时，都不能依赖于 yield() 方法，实际上， yield() 方法经常被滥用。
                // 该线程会把CPU时间片让出来,让自己或者其它线程执行(进行竞争,谁先抢到谁执行)
                Thread.yield();
            }
        }
    }

    @Override
    public String toString() {
        // Thread[pool-1-thread-3,10,main] 10
        // Thread[pool-1-thread-6,1,main] 1
        return Thread.currentThread() + " " + priority;
    }

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        for(int i = 0;i < 5;i++){
            // 10
            service.execute(new SimplePriorities(Thread.MAX_PRIORITY));
        }
        // 1
        service.execute(new SimplePriorities(Thread.MIN_PRIORITY));
    }
}

